package com.wymobilearchitecture.demo.kt

fun main() {

    //泛型接口和使用
    println(Coke().taste().price)
    //泛型类和使用
    BlueColor(Blue()).printColor()
}


/**
 * 泛型接口
 * */
interface Drink<T>{
    fun taste() : T
    fun price(t : T)
}

//使用
class Sweet{
    val price = 5
}

class Coke : Drink<Sweet>{
    override fun taste(): Sweet {
        println("泛型接口 : sweet")
         return Sweet()
    }

    override fun price(t: Sweet) {
        println("泛型接口 : coke price: ${t.price}")
    }
}

/**
 * 泛型类
 */
abstract class Color<T> constructor(var t : T /**泛型字段*/){
    abstract fun printColor()
}

//使用
class Blue{
    val color : String = "blue"
}

class BlueColor constructor(var blue: Blue) : Color<Blue>(blue){
    override fun printColor() {
         //t 是泛型类的 t,就是 blue
         println("泛型类 : ${t.color}" )
         println("泛型类 : ${blue.color}" )
    }
}


/**
 * 泛型方法
 * */
fun <T> fromJson(str : String,tClass : Class<T>) : T?{
    val bean : T = tClass.newInstance()
    return bean
}

/**
 * 泛型约束
 */
fun  test051(){
    listToString(listOf<Int>(1,2,3))

    filterOf(listOf<String>("A","B","C"),"B")
}

//单约束与 Java 一样
fun <T : List<Int>> listToString(t : T) {
    println(t.toString())
}

//多约束 使用 where
fun <T> filterOf(list: List<T>,threshold  : T) : List<T>
        where T : CharSequence,
              T : Comparable<T>{
    //遍历每一项,根据过滤条件 it > threshold,返回一个 list
    return list.filter { it > threshold }.map { it }
}

/**
 * in out
 */
//kotlin 使用协变(out)
//fun sumOfList(list : List<out Number>){}

//Java 上界通配符
//void sumOfList(List<? extends Number> list)

//kotlin 使用逆变(in)
//fun addNumbers(list: List<in Int>)

//java 下界通配符
//void sumOfList(List<? super Integer> list)
